home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / test / spawn.mpp < prev    next >
Encoding:
Text File  |  1993-08-26  |  2.7 KB  |  119 lines

  1. MODULE Spawn;
  2. __IMP_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (* Test und Anwendungsbeispiel fuer Modul 'proc'
  13.  *
  14.  * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
  15.  * das in der Environmentvariablen PATH steht.
  16.  *
  17.  * hk, 20-Aug-93
  18.  *)
  19.  
  20. VAL_INTRINSIC
  21. CAST_IMPORT
  22.  
  23. FROM SYSTEM IMPORT
  24. (* PROC *) ADR;
  25.  
  26. FROM PORTAB IMPORT
  27. (* CONST*) NULL,
  28. (* TYPE *) UNSIGNEDWORD;
  29.  
  30. FROM types IMPORT
  31. (* TYPE *) StrRange, StrPtr, StrArray;
  32.  
  33. IMPORT e;
  34.  
  35. FROM proc IMPORT
  36. (* TYPE *) WaitVal, SpawnMode,
  37. (* PROC *) getpid, getppid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, spawnvp;
  38.  
  39. FROM cstr IMPORT
  40. (* PROC *) strerror;
  41.  
  42. FROM InOut IMPORT
  43. (* PROC *) Read, Write, WriteInt, WriteCard, WriteString, WriteLn;
  44.  
  45. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  46.  
  47. CONST
  48.   MaxArgv = 15;
  49.  
  50. TYPE
  51.   String = ARRAY [0..10] OF CHAR;
  52.  
  53. VAR
  54.   ret    : INTEGER;
  55.   pid    : INTEGER;
  56.   ch     : CHAR;
  57.   state  : WaitVal;
  58.   errstr : ARRAY [0..40] OF CHAR;
  59.  
  60.   idx    : StrRange;
  61.   prg    : String;
  62.   null   : String;
  63.   space  : String;
  64.   arg2   : String;
  65.   arg3   : String;
  66.   arg13  : String;
  67.   argv   : ARRAY [0..MaxArgv] OF StrPtr;
  68.  
  69.  
  70. BEGIN
  71.  WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  72.  WriteString(")"); WriteLn;
  73.  
  74.  prg   := "showcmd";
  75.  null  := "";
  76.  space := " ";
  77.  arg2  := "-2-";
  78.  arg3  := "-3-";
  79.  arg13 := "-13-";
  80.  
  81.  argv[0] := CAST(StrPtr,ADR(prg));
  82.  FOR idx := 1 TO MaxArgv DO
  83.    argv[idx] := CAST(StrPtr,ADR(null));
  84.  END;
  85.  argv[2]       := CAST(StrPtr,ADR(arg2));
  86.  argv[3]       := CAST(StrPtr,ADR(arg3));
  87.  argv[4]       := CAST(StrPtr,ADR(space));
  88.  argv[13]      := CAST(StrPtr,ADR(arg13));
  89.  argv[MaxArgv] := NULL;
  90.  
  91.  e.errno := 0;
  92.  ret     := spawnvp(pWAIT, prg, CAST(StrArray,ADR(argv)));
  93.  
  94.  WriteLn;
  95.  WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  96.  IF e.errno < 0 THEN
  97.    WriteString("): error: ");
  98.    strerror(e.errno, errstr);
  99.    WriteString(errstr);
  100.    WriteLn;
  101.  ELSE
  102.    WriteString("): child-returncode = "); WriteInt(ret, 0); WriteLn;
  103.  
  104.    state := CAST(WaitVal,VAL(UNSIGNEDWORD,ret));
  105.    IF WIFSIGNALED(state) THEN
  106.      WriteString("Terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
  107.    ELSE
  108.      (* "WIFSTOPPED()" braucht nicht abgefragt zu werden, da "wait()"
  109.       * keine gestopten Unterprozesse beruecksichtigt.
  110.       *)
  111.      WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
  112.    END;
  113.  END;
  114.  WriteLn;
  115.  Read(ch);
  116. END Spawn.
  117.  
  118.  
  119.